package _1_常用数据类型_关键字;

import org.junit.Assert;
import org.junit.Test;

/**
 * 基本数据类型
 */
public class _1_PrimitiveType {

  /**
   * 八种 基本数据类型
   */
  @Test
  public void eightPrimitiveType() {
    //基本数据类型：整形(4)、浮点(2)、字符(1)、布尔(1)
    byte b = 127;
    // 可以使用 _ 来分隔数字，方便识别
    short s = 32_767;
    int i = 2_147_483_647;
    long l = 0;

    float f = 0.1f;
    double d = 0.1;

    char c = 'a';

    boolean bl = true;
    int a = 0xffffffff;
    System.out.println(a);
    System.out.println(a+1);
    System.out.println(Integer.MAX_VALUE+1);
    System.out.println(Integer.MIN_VALUE);
    System.out.println(0x80000001);
  }


  /**
   * string 和 char 不能比较 char 与 char 之间用 == 比较
   */
  @Test
  public void compareCharWithString() {
    char charA = 65;
    String strA = "A";
    // A 的 char 值是 65
    // String "A" 和 char 65 不相等
    System.out.println(strA.equals(charA));

    // char 和 char 才能比较
    char charFromStr = strA.charAt(0);
    System.out.println(charFromStr == charA);

  }


  /**
   * 包装数据类型 是对象， 是 Object 的子类
   * <p>
   * 8种基本类型对应八种包装类型：Byte等
   * <p>
   * 包装类型的值可以为 null，基本类型不可以为 null
   */
  @Test
  public void wraps() {
    // Long.ValueOf("String")返回 Long 包装类型
    Long value = Long.valueOf("1");

    // Long.parseLong("String")返回 long 基本数据类型
    long l = Long.parseLong("1");
  }

  @Test
  /**
   * {@link Integer.IntegerCache#low}
   */
  public void integerCache() {
    // 这样不会使用缓存, 是两个不同的对象
    Integer i = new Integer(100);
    Integer j = new Integer(100);
    System.out.println(i == j);

    Integer i1 = 100;
    Integer j1 = Integer.valueOf(100);
    System.out.println("Integer i1 = 100, 这样的写法, 会调用 valueOf(), 使用缓存");
    System.out.println(i1 == j1);

    int i2 = 200;
    int j2 = 200;
    System.out.println(i2 == j2);
  }

  @Test
  public void 进制转换() {
    // 7进制转 10进制
    int i = Integer.parseInt("10",7);
    Assert.assertEquals(i, 7);
    // 10进制转 7 进制

    int a = 888;
    System.out.println(Integer.toString(a, 7));
//    手写实现
    String o = "";
    while (a >= 7) {
      int c = a % 7;
      a = a / 7;
      o = c + o;
    }
    o = a + o;
    System.out.println(o);
  }

}
